package pe.com.rimac.portal.service.facturacion.trama;

import org.apache.commons.lang.StringUtils;

import pe.com.rimac.portal.service.facturacion.criterio.CriterioBusqueda;
import pe.com.rimac.portal.service.facturacion.request.FacturacionRequest;

public class Request
{
	private static final String TRAMA_OPEN = "<TRAMA>";
	private static final String TRAMA_CLOSE = "</TRAMA>";
	private static final String PARAMETERS_OPEN = "<PARAMETERS>";
	private static final String PARAMETERS_CLOSE = "</PARAMETERS>";
	private static final String TIPO_BUSQUEDA = "<TipoBusqueda>?</TipoBusqueda>";
	private static final String TIPO_DOCUMENTO_ID = "<TipoDocId>?</TipoDocId>";
	private static final String NUMERO_DOCUMENTO_ID = "<NumDocId>?</NumDocId>";
	private static final String CODIGO_EMPRESA_SEGUROS = "<CodCiaSeguros>?</CodCiaSeguros>";
	private static final String FECHA_EMISION_INICIO = "<FecEmisionIni>?</FecEmisionIni>";
	private static final String FECHA_EMISION_FIN = "<FecEmisionFin>?</FecEmisionFin>";
	private static final String TIPO_DOCUMENTO_SUNAT = "<TipoDocSunat>?</TipoDocSunat>";
	private static final String SERIE_DOCUMENTO_SUNAT = "<SerieDocSunat>?</SerieDocSunat>";
	private static final String NUMERO_DOCUMENTO_SUNAT = "<NumDocSunat>?</NumDocSunat>";
	private static final String NUMERO_DOCUMENTO = "<NumDoc>?</NumDoc>";
	private static final String CODIGO_PRODUCTO = "<CodProd>?</CodProd>";
	private static final String NUMERO_POLIZA = "<NumPol>?</NumPol>";
	private Header header;
	private FacturacionRequest facturacionRequest;
	private CriterioBusqueda criterioBusqueda;

	/**
	 * @param facturacionRequest
	 * @param criterioBusqueda
	 */
	public Request(Header header, FacturacionRequest facturacionRequest, CriterioBusqueda criterioBusqueda)
	{
		this.header = header;
		this.facturacionRequest = facturacionRequest;
		this.criterioBusqueda = criterioBusqueda;
	}

	/**
	 * @return
	 */
	public String build()
	{
		StringBuilder builder = new StringBuilder();
		builder.append(TRAMA_OPEN);
		builder.append(header.build());
		builder.append(PARAMETERS_OPEN);
		builder.append(StringUtils.replace(TIPO_BUSQUEDA, "?", criterioBusqueda.getValue()));
		builder.append(StringUtils.replace(CODIGO_EMPRESA_SEGUROS, "?", facturacionRequest.getEmpresa()));
		builder.append(StringUtils.replace(TIPO_DOCUMENTO_ID, "?", facturacionRequest.getTipoDocumento()));
		builder.append(StringUtils.replace(NUMERO_DOCUMENTO_ID, "?", facturacionRequest.getNumeroDocumento()));
		
		if (CriterioBusqueda.POR_FECHAS.equals(criterioBusqueda))
		{
			builder.append(StringUtils.replace(FECHA_EMISION_INICIO, "?", facturacionRequest.getFechaInicio()));
			builder.append(StringUtils.replace(FECHA_EMISION_FIN, "?", facturacionRequest.getFechaFin()));
		}
		else if (CriterioBusqueda.POR_NUMERO_DOCUMENTO_SUNAT.equals(criterioBusqueda))
		{
			builder.append(StringUtils.replace(TIPO_DOCUMENTO_SUNAT, "?", facturacionRequest.getTipoDocumentoSUNAT()));
			builder.append(StringUtils.replace(SERIE_DOCUMENTO_SUNAT, "?", facturacionRequest.getSerieDocumentoSUNAT()));
			builder.append(StringUtils.replace(NUMERO_DOCUMENTO_SUNAT, "?",
					facturacionRequest.getNumeroDocumentoSUNAT()));
		}
		else if (CriterioBusqueda.POR_PRODUCTO_Y_POLIZA.equals(criterioBusqueda))
		{
			builder.append(StringUtils.replace(FECHA_EMISION_INICIO, "?", facturacionRequest.getProductoFechaInicio()));
			builder.append(StringUtils.replace(FECHA_EMISION_FIN, "?", facturacionRequest.getProductoFechaFin()));
			builder.append(StringUtils.replace(CODIGO_PRODUCTO, "?", facturacionRequest.getCodigoProducto()));
			builder.append(StringUtils.replace(NUMERO_POLIZA, "?", facturacionRequest.getPoliza()));
		}
		else if (CriterioBusqueda.POR_NUMERO_DOCUMENTO_COBRO.equals(criterioBusqueda))
		{
			builder.append(StringUtils.replace(NUMERO_DOCUMENTO, "?", facturacionRequest.getDocumentoCobro()));
		}
		builder.append(PARAMETERS_CLOSE);
		builder.append(TRAMA_CLOSE);
		return builder.toString();
	}
}